package nc.tb.dim.data;

import java.awt.Component;
import java.awt.Container;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.swing.JButton;
import javax.swing.JComponent;

public class AlphaUIPolicy extends java.awt.FocusTraversalPolicy 
{
	   private SortedMap getSortedButtons(Container focusCycleRoot) {
	     if (focusCycleRoot == null) {
	       throw new IllegalArgumentException("focusCycleRoot can't be null");
	     }
	     SortedMap result = new TreeMap(); // Will sort all buttons by text.
	     sortRecursive(result, focusCycleRoot);
	     return result;
	   }
	   private void sortRecursive(Map buttons, Container container) {
	     for (int i = 0; i < container.getComponentCount(); i++) {
	       Component c = container.getComponent(i);
	       if (c instanceof JComponent) { // Found another button to sort.
	         buttons.put(((JComponent) c).getName(), c);
	       }
	       if (c instanceof Container) { // Found a container to search.
	         sortRecursive(buttons, (Container) c);
	       }
	     }
	   }
	   // The rest of the code implements the FocusTraversalPolicy interface.
	   public Component getFirstComponent(Container focusCycleRoot) {
	     SortedMap buttons = getSortedButtons(focusCycleRoot);
	     if (buttons.isEmpty()) {
	       return null;
	     }
	     return (Component) buttons.get(buttons.firstKey());
	   }
	   public Component getLastComponent(Container focusCycleRoot) {
	     SortedMap buttons = getSortedButtons(focusCycleRoot);
	     if (buttons.isEmpty()) {
	       return null;
	     }
	     return (Component) buttons.get(buttons.lastKey());
	   }
	   public Component getDefaultComponent(Container focusCycleRoot) {
	     return getFirstComponent(focusCycleRoot);
	   }
	   public Component getComponentAfter(Container focusCycleRoot, Component aComponent) {
	     if (!(aComponent instanceof JComponent)) {
	       return null;
	     }
	     SortedMap buttons = getSortedButtons(focusCycleRoot);
	     String nextName = ((JComponent) aComponent).getName() + "\0";
	     SortedMap nextButtons = buttons.tailMap(nextName);
	     if (nextButtons.isEmpty()) { // Wrapped back to beginning
	       if (!buttons.isEmpty()) {
	         return (Component) buttons.get(buttons.firstKey());
	       }
	       return null; 
	     }
	     return (Component) nextButtons.get(nextButtons.firstKey());
	   }
	   public Component getComponentBefore(Container focusCycleRoot, Component aComponent) {
	     if (!(aComponent instanceof JButton)) {
	       return null;
	     }
	     SortedMap buttons = getSortedButtons(focusCycleRoot);
	     SortedMap prevButtons = // Find all buttons before this one.
	     buttons.headMap(((JComponent) aComponent).getName());
	     if (prevButtons.isEmpty()) { // Wrapped back to end.
	       if (!buttons.isEmpty()) {
	         return (Component) buttons.get(buttons.lastKey());
	       }
	       return null; // Degenerate case of no buttons.
	     }
	     return (Component) prevButtons.get(prevButtons.lastKey());
	   }
	}
